from typing import Iterable

import scrapy
from scrapy import Request
from zhihuBook.items import ZhihubookItem
# 导入RedisSpider模块
from scrapy_redis.spiders import RedisSpider

class BookSpider(RedisSpider):
    name = "book"
    allowed_domains = ["douban.com"]
    # start_urls = ["https://book.douban.com/top250?start=0"]  #指定要爬取网站的第一个url地址
    # 分布式爬虫最大的区别之一就是start_urls是手动推动redis数据库,让爬虫程序从redis数据库中读取!
    # 然后所有爬虫【多台机器】爬出来的数据进行汇总存取redis数据库中!
    # start_urls = ["https://book.douban.com/top250"]
    redis_key = 'book:start_urls'

    def parse(self, response):
        # 生成请求连接
        for i in range(0,10):
            # 拼接从第2页到第10页的url地址
            next_url = "https://book.douban.com/top250?start={}".format(i*25)
            # 创建request的对象
            yield scrapy.Request(
                url=next_url,#要继续请求的url
                method="get",#请求的方式
                callback=self.book_parse #请求后拿回来的响应内容进行解析的方法指定
            )
    #         用于页面解析
    def book_parse(self, response):
        # 获取所有书籍的信息所在的table
        tables=response.xpath("//*[@id='content']/div/div[1]/div/table")
        # 声明实体的对象
        book_msg=ZhihubookItem()
        # 循环列表
        for table in tables:
            # 获取table下的tr中的第2个td下的第一个div中的a标签的文本内容放在实体中的book_name的属性中
            book_msg["book_name"]=table.xpath("./tr/td[2]/div[1]/a/text()").extract_first().strip()
            # 获取table下的tr中的第2个td下的第一个p标签的文本内容放在实体中的book_info的属性中
            book_msg["book_info"] = table.xpath("./tr/td[2]/p[1]/text()").extract_first().strip()
            # 获取table下的tr中的第1个td下的a标签中的img的src属性内容放在实体中的book_img的属性中
            book_msg["book_img"] = table.xpath("./tr/td[1]/a/img/@src").extract_first().strip()
            # 获取table下的tr中的第2个td下的第一个div中的a标签的属性内容放在实体中的book_url的属性中
            book_msg["book_url"] = table.xpath("./tr/td[2]/div[1]/a/@href").extract_first().strip()
            yield book_msg
        pass
